<?php

/**
 * 时间处理
 */


// PRC Asia/shanghai  Asia/Beijing Asia/Chongqing
// echo date_default_timezone_get();

date_default_timezone_set('PRC');

echo date_default_timezone_get();

// 当前时间戳
echo time(); // 1665027098
echo '<br>';

// 以秒为单位，精确到最接近的微秒
echo microtime(); // 0.12209200 1665027081
echo microtime(true); // 1665027098.9923
echo '<br>';

/**
 * 统计脚本运行时间 单位s
 *
 * runtime('start');
 * ...
 * runtime('end');
 * echo '当前脚本运行时间' . runtime('start','end');
 *
 * @param null $start
 * @param null $end
 * @return array|float
 */
function runtime($start = null, $end = null)
{
    static $cache = [];
    if (is_null($start)) {
        return $cache;
    } elseif (is_null($end)) {
        return $cache[$start] = microtime(true);
    } else {
        $end = $cache[$end] ?? microtime(true);
        return number_format($end - $cache[$start], 5, '.', ''); // s
    }
}

runtime('for-start');

$arr = [];
for ($i = 0; $i < 1000000; $i++) {
    $arr[] = $i;
}

runtime('for-end');
echo 'for循环运行时间' . runtime('for-start', 'for-end');
echo '<br>';

runtime('foreach-start');

$brr = [];
foreach ($arr as $item) {
    $brr[] = $item;
}
runtime('foreach-end');

echo 'foreach循环运行时间' . runtime('foreach-start', 'foreach-end');
// 总的来说 foreach的效率比for稍快

echo '<br>';
echo date('Y-m-d H:i:s');
// echo date(DATE_RFC2822);
echo date(DATE_RFC3339);

$today = getdate();
// print_r($today);

echo '<br>';
// echo strtotime('2022-2-11 16:12:12');

// echo strtotime("now"), "\n";
// echo strtotime("10 September 2000"), "\n";
// echo strtotime("+1 day"), "\n";
// echo strtotime("+1 week"), "\n";
// echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
// echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";

$str = '111';
if (($timestamp = strtotime($str)) === false) {

}

echo '<br>';

// 使用内置类  DateTime  DateInterval  DateTimeZone

$date_time = new DateTime();
// print_r($date_time);
// echo $date_time->format('Y-m-d H:i:s');
// print_r($date_time);
// $date_time = DateTime::createFromFormat('Y-m-d H:i:s', '2022-10-07 16:37:00');
// echo $date_time->format('Y-m-d H:i:s');

// 计算两个时间的差值 一般后面的值要大于前面的值
$date_time2 = new DateTime('2023-10-07 16:37:00');
$interval = $date_time->diff($date_time2);
// print_r($interval); // 返回 DateInterval 对象
echo $interval->format('%R%a days'); // %R 为 +或-、 %a 共多少天 例如，完整显示：+364 days
echo $interval->format("距离你的生日还有%y年%m个月%d天%h小时%i分钟%s秒 (共 %a 天)"), "\n";
echo '<br>';

// 时间的增加或减少
$interval = new DateInterval('P2D');
/**
 * 格式以字母P开头，代表句号。每个持续时间周期都由一个整数值和一个周期指示符表示。如果持续时间包含时间元素，则规范的这部分前面要加上字母T。
 * - 意思是 除了年月日，如果是 小时 分钟 秒 前面需要加上 T  例如：PT3H
 *
 * 单元类型必须从左边的最大单元到右边的最小单元输入。几年前是几个月，几个月前是几天，几天前是几分钟，等等。因此，一年零四天必须表示为P1Y4D，而不是P4D1Y。
 *
 * Two days is P2D. Two seconds is PT2S. Six years and five minutes is P6YT5M.
 *
 * 三个月
 * $interval = new DateInterval('P3M');
 * 三分钟
 * $interval = new DateInterval('PT3M');
 */

$date_time->add($interval);
echo $date_time->format('Y-m-d H:i:s');

// $date_time->sub($interval);
// echo $date_time->format('Y-m-d H:i:s');
echo '<br>';



